package com.sjms._05_创建_建造者;

/**
 * 建造者模式
 * 将产品与构造过程分离
 * <p>
 * 举例：组装汽车
 * 1.一个产品类，汽车（存在多个属性：底盘、车身、车轮、引擎、其他、品牌）
 * 2.一个抽象构造者类，内部组合一个产品
 * 3.一个实现类，实现抽象构造者，组装车辆
 * 4.一般形式：构造者类通过返回 builder()对象，然后一串链式调用，最后 .build() 返回对象
 * <p>
 * 框架中的应用：
 * StringBuffer(线程安全) StringBuilder
 * Guava 里的不可变对象
 * MyBatis 的 SqlSessionFactoryBuild 里的 双层 Builder( XMLConfigBuilder() )
 */
public class _Test {

    public static void main(String[] args) {

        //创建构造者
        JBCarBuilder jbCarBuilder =
                new JBCarBuilder()
                        .buildChassis("JB底盘")
                        .buildBody("JB专用车身")
                        .buildWheel("JB车轮")
                        .buildEngine("JB引擎")
                        .buildOther("随便找点零件")
                        .buildBrand("J B");

        jbCarBuilder.buildOther("JB专用零件");

        Car build = jbCarBuilder.build();

        System.out.println(build.toString());


        //类比StringBuilder
        StringBuilder sb =
                new StringBuilder()
                        .append("123")
                        .append("2")
                        .append("3");

        String s = sb.toString();

        System.out.println(s);


    }
}
